package native

import "JVM/Jvmgo/GoToJVM/runtimeData"

/*
一些常见的本地方法包括:
	文件操作：如文件读写、文件系统访问等。
	网络操作：如网络通信、套接字操作等。
	图形界面操作：如窗口管理、图形绘制等。
	系统调用：如进程管理、线程管理等。
	性能优化：如使用本地代码进行高性能计算。

本地方法并没有在 JVM规范做出限制
我们要让其在JVM栈里面执行
*/

// 本地方法， frame为方法工作区
type NativeMethod func(frame *runtimeData.Frame)

/*
key: 本地方法身份标识
value: 本地方法具体实现
*/
var registry = map[string]NativeMethod{}

func Register(className, methodName, methodDescriptor string, method NativeMethod) {
	// 类名，方法名，方法描述符构成本地方法的唯一身份辨识
	key := className + "~" + methodName + "~" + methodDescriptor
	registry[key] = method
}

// 从hash表中找寻本地方法
func FindNativeMethod(className, methodName, methodDescriptor string) NativeMethod {
	key := className + "~" + methodName + "~" + methodDescriptor
	if method, ok := registry[key]; ok {
		return method
	}
	if methodDescriptor == "()V" && methodName == "registerNatives" {
		return emptyNativeMethod
	}
	return nil
}

func emptyNativeMethod(frame *runtimeData.Frame) {
	// 由于后续会自己注册本地方法实现，所以该方法没用
}
